package net.realsee.service.wcs.intf.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import net.realsee.common.exception.ServiceException;
import net.realsee.common.utils.StringUtils;
import net.realsee.domain.wcs.intf.WcsAppClass;
import net.realsee.domain.wcs.intf.bo.WcsAppClassBo;
import net.realsee.domain.wcs.intf.vo.WcsAppClassVo;
import net.realsee.framework.core.domain.PageQuery;
import net.realsee.framework.core.page.TableDataInfo;
import net.realsee.mapper.wcs.intf.WcsAppClassMapper;
import net.realsee.service.wcs.intf.IWcsAppClassService;
import org.springframework.stereotype.Service;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 外部系统类别Service业务层处理
 *
 * @author realsee
 * @date 2023-08-11
 */
@RequiredArgsConstructor
@Service
public class WcsAppClassServiceImpl extends ServiceImpl<WcsAppClassMapper, WcsAppClass> implements IWcsAppClassService {

    private final WcsAppClassMapper baseMapper;

    /**
     * 查询外部系统类别
     */
    @Override
    public WcsAppClassVo selectVoById(Long id) {
        return baseMapper.selectVoById(id);
    }

    /**
     * 查询外部系统类别列表
     */
    @Override
    public TableDataInfo<WcsAppClassVo> selectVoPage(WcsAppClassBo bo, PageQuery pageQuery) {
        LambdaQueryWrapper<WcsAppClass> lqw = buildVoQueryWrapper(bo);
        Page<WcsAppClassVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
        return TableDataInfo.build(result);
    }

    /**
     * 查询外部系统类别列表
     */
    @Override
    public List<WcsAppClassVo> selectVoList(WcsAppClassBo bo) {
        LambdaQueryWrapper<WcsAppClass> lqw = buildVoQueryWrapper(bo);
        return baseMapper.selectVoList(lqw);
    }

    private LambdaQueryWrapper<WcsAppClass> buildVoQueryWrapper(WcsAppClassBo bo) {
        Map<String, Object> params = bo.getParams();
        LambdaQueryWrapper<WcsAppClass> lqw = Wrappers.lambdaQuery();
        lqw.eq(bo.getId() != null, WcsAppClass::getId, bo.getId());
        lqw.eq(StringUtils.isNotBlank(bo.getAppClass()), WcsAppClass::getAppClass, bo.getAppClass());
        lqw.eq(StringUtils.isNotBlank(bo.getFuid()), WcsAppClass::getFuid, bo.getFuid());
        lqw.eq(bo.getTextId() != null, WcsAppClass::getTextId, bo.getTextId());
        lqw.eq(bo.getRefrenceId() != null, WcsAppClass::getRefrenceId, bo.getRefrenceId());
        lqw.eq(bo.getUnitId() != null, WcsAppClass::getUnitId, bo.getUnitId());
        lqw.eq(bo.getDelFlag() != null, WcsAppClass::getDelFlag, bo.getDelFlag());
        lqw.eq(StringUtils.isNotBlank(bo.getCreateBy()), WcsAppClass::getCreateBy, bo.getCreateBy());
        lqw.eq(bo.getCreateTime() != null, WcsAppClass::getCreateTime, bo.getCreateTime());
        lqw.eq(StringUtils.isNotBlank(bo.getUpdateBy()), WcsAppClass::getUpdateBy, bo.getUpdateBy());
        lqw.eq(bo.getUpdateTime() != null, WcsAppClass::getUpdateTime, bo.getUpdateTime());
        lqw.eq(StringUtils.isNotBlank(bo.getDeleteBy()), WcsAppClass::getDeleteBy, bo.getDeleteBy());
        lqw.eq(bo.getDeleteTime() != null, WcsAppClass::getDeleteTime, bo.getDeleteTime());
        lqw.eq(bo.getRowVersionStamp() != null, WcsAppClass::getRowVersionStamp, bo.getRowVersionStamp());
        lqw.eq(StringUtils.isNotBlank(bo.getRemark()), WcsAppClass::getRemark, bo.getRemark());
        return lqw;
    }

    /**
     * 新增外部系统类别
     */
    @Override
    public Boolean insertByBo(WcsAppClassBo bo) {
        WcsAppClass add = BeanUtil.toBean(bo, WcsAppClass.class);
        add.setFuid(IdUtil.fastUUID());
        validEntityBeforeSaveOrUpdate(add);
        return this.save(add);
    }

    /**
     * 修改外部系统类别
     */
    @Override
    public Boolean updateByBo(WcsAppClassBo bo) {
        WcsAppClass update = BeanUtil.toBean(bo, WcsAppClass.class);
        validEntityBeforeSaveOrUpdate(update);
        return this.updateById(update);
    }

    /**
     * 批量删除外部系统类别
     */
    @Override
    public Boolean deleteWithValidByIds(Collection<Long> ids) {
        return this.removeBatchByIds(ids);
    }

    /**
     * 保存前的数据校验
     */
    private void validEntityBeforeSaveOrUpdate(WcsAppClass entity) {
        // 做一些数据校验,如唯一约束
        LambdaQueryWrapper<WcsAppClass> lqw = Wrappers.lambdaQuery();
        lqw.eq(WcsAppClass::getAppClass, entity.getAppClass());
        lqw.ne(ObjectUtil.isNotNull(entity.getId()), WcsAppClass::getId, entity.getId());
        List<WcsAppClass> wcsAppClassList = this.list(lqw);
        if (CollUtil.isNotEmpty(wcsAppClassList)) {
            throw new ServiceException(StrUtil.format("代码名称已重复, code={}", entity.getAppClass()));
        }
    }
}
